
package appvideo.persistencia;

import appvideo.logica.Alquiler;
import appvideo.logica.Empleado;
import appvideo.logica.Pelicula;
import appvideo.logica.ProductoAlquilado;
import appvideo.logica.Promociones;
import appvideo.logica.PromocionesDiasSemana;
import appvideo.logica.PromocionesGenero;
import appvideo.logica.PromocionesMasPorMenos;
import appvideo.logica.PromocionesPuntos;
import appvideo.logica.Propietario;
import appvideo.logica.Proveedor;
import appvideo.logica.Salario;
import appvideo.logica.Socio;
import appvideo.logica.Tarifa;
import appvideo.logica.Tarjeta;
import appvideo.logica.Usuario;
import appvideo.logica.Videojuego;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.management.timer.Timer;
import java.util.Iterator;
import java.util.List;




public class PersistenciaAlquiler {
    
    public static List<Alquiler> getAlquileres(int opcion){
        List<Alquiler> alquileres = new ArrayList<Alquiler>();
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        Socio socio=null;
        
        try {
                //SELECCION DE TODOS LOS ALQUILERES ACTIVOS
                st=con.createStatement();
                //Devolver todos los alquileres activos(caducados y no caducados)
                if(opcion==1){
                    rs = st.executeQuery("SELECT dni FROM alquileres "
                            + "INNER JOIN personas ON alquileres.id_socio = personas.id "
                            + "WHERE alquileres.estado =1 AND tipo =3");
                    
                //Devolver unicamente los alquileres con productos caducados    
                }else if(opcion==2){
                    // ¿Devolver todos los alquileres menos aquellos con productos caducados
                    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                    String query = "SELECT DISTINCT alquileres.id, dni FROM alquileres "
                            + "INNER JOIN productos_alquilados ON alquileres.id = productos_alquilados.id_alquiler "
                            + "INNER JOIN personas ON alquileres.id_socio = personas.id "
                            + "WHERE '"+dt.format(new Date())+"' > productos_alquilados.fFin AND personas.tipo =3";
                    rs = st.executeQuery(query);
                }
                
                int i=0;
                List<String> dni_alquileres = new ArrayList<String>();
                while(rs.next()){
                    dni_alquileres.add(rs.getString("dni"));
                }
                
                for(String dni_socio: dni_alquileres){
                    alquileres.add(buscaAlquiler(dni_socio));
                }
                
        } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
        } finally {
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        return alquileres;
    }
    
    //Inserta o actualiza un alquiler de la base de datos
    public static boolean altaAlquiler(Alquiler a) throws Exception{
        boolean ret=false;
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        try {
                st=con.createStatement();
                //Comprobar si el socio ya tiene un alquiler activo en la base de datos
                rs = st.executeQuery("SELECT COUNT(0) FROM alquileres "
                        + "WHERE alquileres.id_socio = "+a.getSocio().getId()+" AND estado=1 ");
                
                rs.next();
                if(rs.getInt(1)==1){
                    //Si el socio tiene un alquiler en activo, no puede realizar mas alquileres
                    //hasta que complete el anterior(es decir, devuelva todos los productos)
                    //Enviar una excepcion para que sea capturada en otras capas
                    throw new Exception("El Socio con dni: "+a.getSocio().getDni()+" ya tiene un alquiler en activo");
                }else if(rs.getInt(1)==0){
                    //No hay alquiler activo para el socio->
                    //HACEMOS INSERCION DE ALQUILER
                    int idUsuario=0;
                    if(a.getUsuario() instanceof Empleado){
                        idUsuario=((Empleado)a.getUsuario()).getId();
                    }else if(a.getUsuario() instanceof Propietario){
                        idUsuario=((Propietario)a.getUsuario()).getId();
                    }else if(a.getUsuario() instanceof Socio){
                        idUsuario=((Socio)a.getUsuario()).getId();
                    }
                    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
                    if(a.getPromocion()==null){//Si no hay promocion
                        st.executeUpdate("INSERT INTO alquileres (id_socio,coste,id_usuario,estado)"
                            + " VALUES ("+a.getSocio().getId()+","+a.getCoste()+","+idUsuario+",1)");
                    }else{
                        
                        if(a.getPromocion() instanceof PromocionesDiasSemana){
                            st.executeUpdate("INSERT INTO alquileres (id_socio,coste,id_usuario,estado,id_promocion,tipo_promo)"
                                + " VALUES ("+a.getSocio().getId()+","+a.getCoste()+","+idUsuario+",1,"+a.getPromocion().getId()+",1)");
                        }else if(a.getPromocion() instanceof PromocionesGenero){
                            st.executeUpdate("INSERT INTO alquileres (id_socio,coste,id_usuario,estado,id_promocion,tipo_promo)"
                            + " VALUES ("+a.getSocio().getId()+","+a.getCoste()+","+idUsuario+",1,"+a.getPromocion().getId()+",2)");
                        }else if(a.getPromocion() instanceof PromocionesMasPorMenos){
                            st.executeUpdate("INSERT INTO alquileres (id_socio,coste,id_usuario,estado,id_promocion,tipo_promo)"
                            + " VALUES ("+a.getSocio().getId()+","+a.getCoste()+","+idUsuario+",1,"+a.getPromocion().getId()+",3)");
                        }else if(a.getPromocion() instanceof PromocionesPuntos){
                            st.executeUpdate("INSERT INTO alquileres (id_socio,coste,id_usuario,estado,id_promocion,tipo_promo)"
                            + " VALUES ("+a.getSocio().getId()+","+a.getCoste()+","+idUsuario+",1,"+a.getPromocion().getId()+",4)");
                        }
                    }
                    
                    //CONSULTA ULTIMO ID ALQUILER INSERTADO(Llevar control del id en las dos tablas que inserto al mismo tiempo)
                    rs = st.executeQuery("SELECT MAX(id) FROM alquileres");
                    rs.next();
                    int id_alquiler = rs.getInt(1); 
                    
                    //TAMBIEN HACEMOS INSERCION EN PRODUCTOS ALQUILADOS
                    Iterator it = a.getProductosAlquilados().iterator();
                    while(it.hasNext()){//Recorremos productos a insertar
                        ProductoAlquilado pa = (ProductoAlquilado)it.next();
                        
                        if(pa.getProducto() instanceof Videojuego){
                            st.executeUpdate("INSERT INTO productos_alquilados (id_alquiler,fInicio,fFin,id_pel,id_vid) "
                            + "VALUES ("+id_alquiler+",'"+dt.format(pa.getfAlquiler())+"','"+dt.format(pa.getfFin())+"',0,"+pa.getProducto().getId()+")");
                            st.executeUpdate("UPDATE videojuegos SET estado=3 WHERE id="+pa.getProducto().getId()+"");
                        }else if(pa.getProducto() instanceof Pelicula){
                            st.executeUpdate("INSERT INTO productos_alquilados (id_alquiler,fInicio,fFin,id_pel,id_vid) "
                            + "VALUES ("+id_alquiler+",'"+dt.format(pa.getfAlquiler())+"','"+dt.format(pa.getfFin())+"',"+pa.getProducto().getId()+",0)");
                            st.executeUpdate("UPDATE peliculas SET estado=3 WHERE id="+pa.getProducto().getId()+"");
                        }
                    }
                    ret = true;
                }else{
                    throw new Exception("Hay mas de un alquiler activo para este socio.");
                }
                
            } catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            } finally {
                try {
                    rs.close();
                    st.close();
                    con.close();
                }catch (SQLException sqlex) {
                    System.out.println(sqlex.getMessage());
                }catch(Exception ex){
                    System.out.println(ex.getMessage());
                }
            }
            
        
        return ret;
    }
    
    //Este metodo borra todo rastro existente de un alquiler, pues nunca debio existir ya
    //que es producto de un malentendido entre usuario y cliente.
    public static boolean anularAlquiler(Alquiler alquiler){
        boolean ret=false;
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        
         try {
            st=con.createStatement();
            //Borro el registro de alquiler
            st.executeUpdate("DELETE FROM alquileres WHERE id="+alquiler.getId()+"");
            //Borro los registros de productos al alquiler que corresponden al alquiler deseado
            st.executeUpdate("DELETE FROM productos_alquilados WHERE id_alquiler="+alquiler.getId()+"");
            
            Iterator it = alquiler.getProductosAlquilados().iterator();
            while(it.hasNext()){
                ProductoAlquilado pa = (ProductoAlquilado)it.next();
                if(pa.getProducto() instanceof Videojuego){
                    st.executeUpdate("UPDATE videojuegos SET estado=1 WHERE id="+pa.getProducto().getId()+"");
                    ret=true;
                }else if(pa.getProducto() instanceof Pelicula){
                    st.executeUpdate("UPDATE peliculas SET estado=1 WHERE id="+pa.getProducto().getId()+"");
                    ret=true;
                }
            }
            
         }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
         } finally {
            try {
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        
        return ret;
    }
    
    public static boolean insertarNuevoProductoAlquilado(ProductoAlquilado pAlq,int id_alquiler){
        boolean ret=false;
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
         

        try {
            st=con.createStatement();
            //Insercion de las nuevas peliculas
            SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
            if(pAlq.getProducto() instanceof Videojuego){
                st.executeUpdate("INSERT INTO productos_alquilados (id_alquiler,fInicio,fFin,id_pel,id_vid) "
                + "VALUES ("+id_alquiler+",'"+dt.format(pAlq.getfAlquiler())+"','"+dt.format(pAlq.getfFin())+"',0,"+pAlq.getProducto().getId()+")");
                st.executeUpdate("UPDATE videojuegos SET estado=3 WHERE id="+pAlq.getProducto().getId()+"");
                ret=true;
            }else if(pAlq.getProducto() instanceof Pelicula){
                st.executeUpdate("INSERT INTO productos_alquilados (id_alquiler,fInicio,fFin,id_pel,id_vid) "
                + "VALUES ("+id_alquiler+",'"+dt.format(pAlq.getfAlquiler())+"','"+dt.format(pAlq.getfFin())+"',"+pAlq.getProducto().getId()+",0)");
                st.executeUpdate("UPDATE peliculas SET estado=3 WHERE id="+pAlq.getProducto().getId()+"");
                ret=true;
            }
                
        }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
        } finally {
            try {
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        
        return ret;
    }
    
 
    
    //Hacer una devolucion de un unico producto. La variable ultimoProducto controla
    //si es el ultimo producto del alquiler
    public static boolean devolucionProductoAlquilado(ProductoAlquilado pa,int id_alquiler,boolean ultimoProducto){
        boolean ret=false;
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        
        try{
            st=con.createStatement();
            
            SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
            int filAff= st.executeUpdate("UPDATE productos_alquilados SET fEntrega ='"+dt.format(pa.getfEntrega())+"' WHERE id="+pa.getId()+"");
            if(filAff==1){
                ret=true;
            }
            if(pa.getProducto() instanceof Pelicula)
                st.executeUpdate("UPDATE peliculas SET estado=1 WHERE id="+pa.getProducto().getId()+"");
            else if(pa.getProducto() instanceof Videojuego)
                st.executeUpdate("UPDATE videojuegos SET estado=1 WHERE id="+pa.getProducto().getId()+"");
            
            if(ultimoProducto){
                //Si era el ultimo producto pon el alquiler a terminado
                st.executeUpdate("UPDATE alquileres SET estado=2 WHERE id="+id_alquiler+"");
            }
            
        }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
        }catch(Exception e){
            System.out.println(e.getMessage());
        }finally {
            try {
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            }
        }
        
        return ret;
    }
    
    public static boolean prolongarProductoAlquilado(ProductoAlquilado pa){
        boolean ret = false; 
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        
        try{
            st = con.createStatement();
            SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
            st.executeUpdate("UPDATE productos_alquilados SET fFin='"+dt.format(pa.getfFin()) +"' WHERE id="+pa.getId());
            ret=true;
        }catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } catch(Exception ex){
            System.out.println(ex.getMessage());
        }finally{
            try {
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            } 
        }
        
        
        return ret;
    }
    
    public static Alquiler buscaAlquiler(String dniSocio){
        ProductoAlquilado pa = null;
        Usuario usuario = null;
        Tarjeta tarj = null;
        Socio socio = null;
        Promociones promocion = null;
        List<ProductoAlquilado> productosAlquilados = new ArrayList<ProductoAlquilado>();
        Alquiler alquiler=null;
        
        
        Connection con = Persistencia_Conexion.getConnection();
        Statement st=null;
        ResultSet rs=null;
        
        try{
            st = con.createStatement();
            //Esta consulta devuelve los productos alquilados por dni de un empleado
            rs = st.executeQuery("SELECT id FROM personas WHERE dni='"+dniSocio+"'");
            if(rs.next()){
                int idSocio = rs.getInt("id");
                //Compruebo que hay un alquiler al menos para ese socio
                rs = st.executeQuery("SELECT COUNT(0) FROM alquileres WHERE id_socio="+idSocio+" AND estado=1");
                rs.next();
                if(rs.getInt("COUNT(0)")==1){
                    //Con esta consulta me saco los datos necesarios para crear:
                    //Productos Alquilados, Socio y Datos pertenecientes de un Alquiler
                    //ATENCION: Solo si un alquiler esta activo(estado=1).
                    //ATENCION: Devuelque aquellos productos alquilados que no esten aun entregados
                    String query="SELECT DISTINCT alquileres.id, alquileres.id_socio, coste, alquileres.id_usuario, id_promocion, tipo_promo, "
                            + "productos_alquilados.id,fInicio, fEntrega, fFin, id_pel, id_vid, "
                            + "nombre, apellidos, dni, password, email, tlf, fecha_alta, "
                            + "credito, num_tarjeta, tarjetas.puntos "
                            + " FROM alquileres INNER JOIN productos_alquilados ON alquileres.id = id_alquiler"
                            + " INNER JOIN personas ON personas.id = alquileres.id_socio"
                            + " INNER JOIN tarjetas ON tarjetas.id_socio = personas.id"
                            + " WHERE personas.id = "+idSocio+" AND alquileres.estado=1"
                            + " AND fEntrega IS NULL";

                    rs = st.executeQuery(query);
                    if(rs.next()){

                     //Me creo el socio y datos de su tarjeta
                    tarj = new Tarjeta(rs.getInt("num_tarjeta"),rs.getInt("tarjetas.puntos"),rs.getDouble("credito"));
                    socio = new Socio(rs.getInt("alquileres.id_socio"),rs.getString("nombre"), 
                            rs.getString("apellidos"), rs.getString("dni"), rs.getString("email"), 
                            rs.getInt("tlf"), rs.getDate("fecha_alta"),rs.getString("password"),tarj);
                    }

                    //Me guardo todos los datos siguientes que necesitare mas adelante
                    //para crear el resto de objetos
                    int id_alquiler = rs.getInt("alquileres.id");
                    int id_usuario=rs.getInt("alquileres.id_usuario");
                    double coste = rs.getDouble("coste");
                    int id_promocion = rs.getInt("id_promocion");
                    int tipo_promocion = rs.getInt("tipo_promo");

                    //Devuelvo el puntero al ppio para recuperar los productos ahora
                    rs.beforeFirst();

                    //Con este codigo preparo la array de productos alquilados que metere en el objeto Alquiler
                    //Luego procedere a rellenar los datos de cada producto
                    while(rs.next()){
                        if(rs.getInt("id_vid")>0){
                            Videojuego v = new Videojuego(rs.getInt("id_vid"));
                            pa = new ProductoAlquilado(rs.getInt("productos_alquilados.id"),v,rs.getDate("fInicio"),rs.getDate("fFin"),rs.getDate("fEntrega"));
                        }else if(rs.getInt("id_pel")>0){
                            Pelicula p = new Pelicula(rs.getInt("id_pel"));
                            pa = new ProductoAlquilado(rs.getInt("productos_alquilados.id"),p,rs.getDate("fInicio"),rs.getDate("fFin"),rs.getDate("fEntrega"));
                        }

                        productosAlquilados.add(pa);
                    }

                    rs = st.executeQuery("SELECT id,nombre, apellidos, dni, password, email, tlf, fecha_alta,tipo "
                            + "FROM personas WHERE id="+id_usuario+"");
                    rs.next();

                    if(rs.getInt("tipo")==1){
                        usuario = new Propietario(rs.getInt("id"),rs.getString("nombre"), rs.getString("apellidos"), rs.getString("dni"), rs.getString("email"), rs.getInt("tlf"), rs.getDate("fecha_alta"),rs.getString("password"));
                    }else if(rs.getInt("tipo")==2){
                        usuario = new Empleado(rs.getInt("id"),rs.getString("nombre"), rs.getString("apellidos"), rs.getString("dni"), rs.getString("email"), rs.getInt("tlf"),null, rs.getDate("fecha_alta"),rs.getString("password"));
                        rs = st.executeQuery("Select horas_trab,precio_hora"
                            + " FROM salarios INNER JOIN personas ON personas.id=salarios.id_emp "
                            + "WHERE personas.id='"+id_usuario+"' AND personas.tipo=2");
                        rs.next();
                        Salario sal = new Salario(rs.getInt("horas_trab"),rs.getFloat("precio_hora"));
                        ((Empleado)usuario).setSal(sal);
                    }else if(rs.getInt("tipo")==3){
                        //Este extraño caso, es cuando el socio hace el alquiler por el cajero,
                        //por tanto el usuario que lo realizó es él mismo. 
                        usuario = socio;
                    }

                    //CREACION DE LA PROMOCION(Hasta que no este terminado, postergo este codigo)
                    //Uso del id de promocion y el tipo que guarde anteriormente
                    promocion = null;
                    
                    
                    boolean activa = true;
                    
                    
                    if(tipo_promocion==1){//Dia Feliz
                        rs = st.executeQuery("SELECT pdf_id,pdf_nom,pdf_fei,pdf_fef,pdf_act,pdf_dia,pdf_des "
                                + "FROM promociondiafeliz"
                            + " WHERE pdf_id="+id_promocion+"");
                        if(rs.next()){
                            if(rs.getInt("pdf_act")==0){
                                activa=false;
                            }
                            promocion = new PromocionesDiasSemana(rs.getInt("pdf_id"),rs.getString("pdf_nom"),
                                rs.getDate("pdf_fei"),rs.getDate("pdf_fef"),
                                activa,rs.getInt("pdf_dia"),rs.getDouble("pdf_des"),"Dia Feliz");
                        }
                    }else if(tipo_promocion==2){ //Genero
                        rs = st.executeQuery("SELECT pge_id,pge_nom,pge_fei,pge_fef,pge_act,pge_gen,pge_des "
                                + "FROM promociongenero"
                            + " WHERE pge_id="+id_promocion+"");
                        if(rs.next()){
                            if(rs.getInt("pge_act")==0){
                                activa=false;
                            }
                            promocion = new PromocionesGenero(rs.getInt("pge_id"),rs.getString("pge_nom"), rs.getDate("pge_fei"), rs.getDate("pge_fef"), activa, rs.getString("pge_gen"), rs.getDouble("pge_des"), "Genero");
                        }
                    }else if(tipo_promocion==3){//Mas por Menos
                       rs = st.executeQuery("SELECT pmm_id,pmm_nom,pmm_fei,pmm_fef,pmm_act,pmm_alq,pmm_ent "
                                + "FROM promocionmaspormenos"
                            + " WHERE pmm_id="+id_promocion+"");
                        if(rs.next()){
                            if(rs.getInt("pmm_act")==0){
                                activa=false;
                            }
                            promocion = new PromocionesMasPorMenos(rs.getInt("pmm_id"),rs.getString("pmm_nom"), rs.getDate("pmm_fei"), rs.getDate("pmm_fef"), activa, rs.getInt("pmm_alq"), rs.getInt("pmm_ent"), "Mas por Menos"); 
                        }
                    }else if(tipo_promocion==4){//Puntos
                        rs = st.executeQuery("SELECT ppu_id,ppu_nom,ppu_fei,ppu_fef,ppu_act,ppu_pun "
                                + "FROM promocionpuntos"
                            + " WHERE ppu_id="+id_promocion+"");
                        if(rs.next()){
                            if(rs.getInt("ppu_act")==0){
                                activa=false;
                            }
                        promocion = new PromocionesPuntos(rs.getInt("ppu_id"),rs.getString("ppu_nom"), rs.getDate("ppu_fei"), rs.getDate("ppu_fef"), activa, rs.getInt("ppu_pun"),"Puntos");
                        }
                    }
                    
                  

                    //Por ultimo, antes de devolver el objeto Alquiler, relleno los datos que aun faltaban en PRODUCTO 
                    // de Array de productos Alquilados
                    Iterator it = productosAlquilados.iterator();
                    while(it.hasNext()){
                        pa = (ProductoAlquilado)it.next();
                        if(pa.getProducto() instanceof Pelicula){
                            query = "SELECT peliculas.id,peliculas.codigo,peliculas.nombre,id_prov,fCompra,id_tarifa,genero,duracion,formato,"
                                    + "proveedores.nombre, proveedores.email, direccion, telefono, fAlta,"
                                    + "tarifas.nombre, precio"
                                    + " FROM peliculas"
                                    + " INNER JOIN proveedores ON peliculas.id_prov=proveedores.id"
                                    + " INNER JOIN tarifas ON peliculas.id_tarifa=tarifas.id"
                                    + " WHERE peliculas.id="+((Pelicula)pa.getProducto()).getId()+"";
                            
                            rs = st.executeQuery(query);

                            rs.next();

                            ((Pelicula)pa.getProducto()).setDuracion(rs.getInt("duracion"));
                            ((Pelicula)pa.getProducto()).setFormato(rs.getString("formato"));
                            pa.getProducto().setNombre(rs.getString("peliculas.nombre"));

                        }else if(pa.getProducto() instanceof Videojuego){
                            rs = st.executeQuery("SELECT videojuegos.id,videojuegos.codigo,videojuegos.nombre,id_prov,fCompra,id_tarifa,genero,plataforma,"
                                    + "proveedores.nombre, proveedores.email, direccion, telefono, fAlta,"
                                    + "tarifas.nombre, precio"
                                    + " FROM videojuegos"
                                    + " INNER JOIN proveedores ON videojuegos.id_prov=proveedores.id"
                                    + " INNER JOIN tarifas ON videojuegos.id_tarifa=tarifas.id"
                                    + " WHERE videojuegos.id="+((Videojuego)pa.getProducto()).getId()+"");

                            rs.next();
                            ((Videojuego)pa.getProducto()).setPlataforma(rs.getString("plataforma"));
                            pa.getProducto().setNombre(rs.getString("videojuegos.nombre"));
                        }
                        Tarifa tar = new Tarifa(rs.getString("tarifas.nombre"),rs.getDouble("precio"));
                        Proveedor prov = new Proveedor(rs.getInt("id_prov"), rs.getString("proveedores.nombre"), rs.getString("email"),
                                rs.getString("direccion"), rs.getInt("telefono"), rs.getDate("fAlta"));

                        pa.getProducto().setCodigo(rs.getInt("codigo"));
                        pa.getProducto().setFechacompra(rs.getDate("fCompra"));
                        pa.getProducto().setGenero(rs.getString("genero"));
                        pa.getProducto().setProveedor(prov);
                        pa.getProducto().setTarifa(tar);
                    }


                    alquiler = new Alquiler(id_alquiler, coste,usuario, productosAlquilados, socio, promocion);


                }
            }
        }catch (SQLException sqlex) {
            System.out.println(sqlex.getMessage());
        } catch(Exception ex){
            System.out.println(ex.getMessage());
        }finally{
            try {
                rs.close();
                st.close();
                con.close();
            }catch (SQLException sqlex) {
                System.out.println(sqlex.getMessage());
            }catch(Exception ex){
                System.out.println(ex.getMessage());
            } 
        }
        
        return alquiler;
    }
    
}
